var Container = function(x) {
  this.__value = x;
}

Container.of = function(x) { return new Container(x); };

console.log(Container.of(3))

Container.prototype.map = function(f){
  return Container.of(f(this.__value))
}

console.log(Container.of(2).map(function(two){ return two + 2 }))
// functor 是实现了 map 函数并遵守一些特定规则的容器类型。
// 让容器自己去运用函数能给我们带来什么好处？答案是抽象，对于函数运用的抽象。

var Maybe = function(x) {
  this.__value = x;
}

Maybe.of = function(x) {
  return new Maybe(x);
}

Maybe.prototype.isNothing = function() {
  return (this.__value === null || this.__value === undefined);
}

Maybe.prototype.map = function(f) {
  return this.isNothing() ? Maybe.of(null) : Maybe.of(f(this.__value));
}
//Maybe 看起来跟 Container 非常类似，但是有一点不同：Maybe 会先检查自己的值是否为空，然后才调用传进来的函数。
